package hyl.core.net;

import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.SocketChannel;
import hyl.core.run.IFilterT1;

/*我们假设TCP数据包的结构 包长度+包体 */
/*包长度 = 包体长度,包长度本身是4个字节 可以转换为int类型*/
/*把读到的数据转成 DataPack*/
/**
 * NIOReader 实例化目的 为了接收 socketchannel 中的数据 <br>
 * 
 * 每个通道 channel 都有自己的reader ,reader 把通道中的数据 取出 分解出完整的 数据包NIOData1 <br>
 * 
 * 
 * 
 * 我们可以进行双工通信<br>
 * 
 * 并且解决了分包和粘包的问题<br>
 * 
 * 数据接收后 转交给 上层函数处理<br>
 * 
 * @author 37798955@qq.com
 *
 */
public class NioReader {

	ByteBuffer readBuffer;
	static int i接收缓存大小 = 1024;

	public static int get接收缓存大小() {
		return i接收缓存大小;
	}

	public static void set接收缓存大小(int bUFSIZE) {
		i接收缓存大小 = bUFSIZE;
	}

	IFilterT1<SelectionKey> _收到处理函数 = null;

	public NioReader(IFilterT1<SelectionKey> 收到函数) {
		readBuffer = ByteBuffer.allocate(i接收缓存大小);
		_收到处理函数 = 收到函数;
	}

//
//	public ByteArrayOutputStream getOutputStream() {
//		return baos;
//	}
//
//	public String getRequestString(String 编码) throws UnsupportedEncodingException {
//		if (MyFun.isEmpty(编码))
//			return baos.toString();
//		else
//			return baos.toString(编码);
//	}
//
//	public byte[] getRequestBytes() {
//		return baos.toByteArray();
//	}
//	 List<byte[]> list = new ArrayList<>();
//	public String getRequestString(String 编码) {
//		byte[] bb = MyFun.concat(list);
//		Charset charset = MyCharset._UTF8;
//		if (!MyFun.isEmpty(编码))
//			charset = Charset.forName(编码);
//		return MyFun.byteArray2Str(bb, charset);
//	}
//
//	public byte[] getRequestBytes() {
//		return MyFun.concat(list);
//	}

	public void read(SelectionKey key) throws IOException {
		SocketChannel sc = (SocketChannel) key.channel();

		byte[] bytes = null;
		int size = 0;
		long n = 0;
		ByteArrayOutputStream baos = new ByteArrayOutputStream();
		while ((size = sc.read(readBuffer)) > 0) {
			readBuffer.flip();
			bytes = new byte[size];
			readBuffer.get(bytes);
			// System.out.println("dd:" + new String(bytes));
			baos.write(bytes);
			n += size;
			// baos.flush(); 无效
			// list.add(bytes);
			readBuffer.clear();
		}

		if (_收到处理函数 == null)
			return;
		if (n > 0) {
			byte[] bb = baos.toByteArray();
			_收到处理函数.where(bb, key);
			System.out.println("===" + n);
		}
	}

//	public void clear() {
//		//list.clear();
//	//	baos.close();
//	}

}
